Skip to content

OpenClaw 定时任务配置完全指南

定时任务让 AI 助理从"被动响应"变为"主动服务"。通过 cron 工具,你可以配置每日报告、定期检查、定时提醒等自动化任务。本文详细介绍定时任务的配置方法和实战应用。

一、工具概述

cron 工具能力

  • 调度执行:支持 cron 表达式、间隔执行、一次性执行
  • 任务类型:agentTurn(AI 任务)、systemEvent(系统事件)
  • 交付方式:announce(通知)、webhook(回调)
  • 会话管理:main(主会话)、isolated(隔离会话)

基本用法

javascript
// 添加定时任务
cron(
  action="add",
  job={
    name: "任务名称",
    schedule: {
      kind: "cron",
      expr: "0 8 * * *",  // 每天 8:00
      tz: "Asia/Shanghai"
    },
    payload: {
      kind: "agentTurn",
      message: "执行任务内容",
      timeoutSeconds: 300
    },
    sessionTarget: "isolated"
  }
)

// 查看任务列表
cron(action="list")

// 立即执行任务
cron(action="run", jobId="任务 ID")

// 删除任务
cron(action="remove", jobId="任务 ID")

二、调度类型详解

1. Cron 表达式(周期性执行)

javascript
// 每天 8:00
{ kind: "cron", expr: "0 8 * * *", tz: "Asia/Shanghai" }

// 每周一 9:00
{ kind: "cron", expr: "0 9 * * 1", tz: "Asia/Shanghai" }

// 每小时整点
{ kind: "cron", expr: "0 * * * *" }

// 每 15 分钟
{ kind: "cron", expr: "*/15 * * * *" }

// 每天 8:00 和 20:00
{ kind: "cron", expr: "0 8,20 * * *" }

// 工作日 9:00
{ kind: "cron", expr: "0 9 * * 1-5", tz: "Asia/Shanghai" }

Cron 表达式格式

* * * * *
│ │ │ │ │
│ │ │ │ └─ 星期 (0-7, 0 和 7 都是周日)
│ │ │ └─── 月份 (1-12)
│ │ └───── 日期 (1-31)
│ └─────── 小时 (0-23)
└───────── 分钟 (0-59)

特殊字符

字符含义示例
*任意值* * * * * 每分钟
,分隔多个值0 8,12,18 * * * 8 点、12 点、18 点
-范围0 9-17 * * 1-5 工作日 9-17 点
/间隔*/15 * * * * 每 15 分钟

2. 间隔执行(相对时间)

javascript
// 每 30 分钟执行一次
{ kind: "every", everyMs: 1800000 }

// 每 24 小时执行一次
{ kind: "every", everyMs: 86400000 }

// 每 24 小时执行,从指定时间开始
{ 
  kind: "every", 
  everyMs: 86400000,
  anchorMs: new Date("2026-03-19T08:00:00+08:00").getTime()
}

3. 一次性执行(绝对时间)

javascript
// 在指定时间执行一次
{ 
  kind: "at", 
  at: "2026-03-20T08:00:00+08:00" 
}

// 10 分钟后执行
{ 
  kind: "at", 
  at: new Date(Date.now() + 10 * 60000).toISOString() 
}

三、实战案例 1:每日早晨报告

场景说明

每天早晨 8:00 自动执行:

  1. 检查未读邮件
  2. 查看今日日历
  3. 获取天气预报
  4. 生成汇总报告发送到飞书

完整配置

javascript
cron(
  action="add",
  job={
    name: "每日早晨报告",
    schedule: {
      kind: "cron",
      expr: "0 8 * * *",
      tz: "Asia/Shanghai"
    },
    payload: {
      kind: "agentTurn",
      message: `
请生成每日早晨报告,包括:

1. 检查未读邮件(如有紧急邮件请标注)
   - 使用 message 工具查询邮件

2. 查看今日日历事件(特别是 2 小时内的)
   - 列出所有事件的时间和主题

3. 获取驻马店天气预报
   - 使用 web_search 或 exec 调用天气 API

4. 检查是否有待处理的提醒
   - 查看记忆文件中的提醒

生成简洁的报告,使用以下格式:

📧 邮件:[数量] 封未读,[紧急内容摘要]
📅 今日日程:[事件列表]
🌤️ 天气:[温度、天气状况、建议]
⏰ 提醒:[待办事项]

如果没有重要内容,回复"一切正常"即可。
      `,
      timeoutSeconds: 300
    },
    sessionTarget: "isolated",
    delivery: {
      mode: "announce"
    }
  }
)

执行结果示例

📊 每日早晨报告 - 2026 年 3 月 19 日

📧 邮件:3 封未读
   - [紧急] 项目评审会议改期通知(今天 10:00)
   - 系统自动备份完成报告
   - 订阅周刊:AI 技术前沿第 52 期

📅 今日日程:
   - 10:00 项目评审会议(已改期)
   - 14:00 团队周会
   - 16:30 客户演示

🌤️ 天气:驻马店 晴 12-23°C
   建议:天气晴朗,适合户外活动

⏰ 提醒:
   - 明天是母亲生日,记得准备礼物
   - 周五前提交季度报告

四、实战案例 2:系统健康检查

场景说明

每 4 小时检查一次系统状态,异常时立即通知。

完整配置

javascript
cron(
  action="add",
  job={
    name: "系统健康检查",
    schedule: {
      kind: "cron",
      expr: "0 */4 * * *",  // 每 4 小时
      tz: "Asia/Shanghai"
    },
    payload: {
      kind: "agentTurn",
      message: `
执行系统健康检查:

1. 检查 OpenClaw 网关状态
   - 运行:openclaw gateway status
   - 异常则记录并尝试重启

2. 检查 Nginx 服务
   - 运行:systemctl status nginx
   - 异常则记录并尝试重启

3. 检查磁盘空间
   - 运行:df -h /home
   - 使用率 > 90% 则告警

4. 检查内存使用
   - 运行:free -h
   - 使用率 > 90% 则清理浏览器进程

5. 检查关键进程
   - 运行:ps aux | grep -E "node|nginx"
   - 确认进程正常运行

检查标准:
- 磁盘使用 > 90%:严重
- 内存使用 > 90%:严重  
- 服务未运行:严重

发现严重问题时:
1. 尝试自动修复(如重启服务)
2. 发送通知到飞书
3. 记录详细日志

无问题时回复"系统正常",不需要发送通知。
      `,
      timeoutSeconds: 600
    },
    sessionTarget: "isolated"
  }
)

告警消息示例

🚨 系统告警 - 2026-03-19 12:00

【严重】磁盘空间不足
- 使用率:92%
- 位置:/home
- 可用:8.5GB

【已执行操作】
1. 清理浏览器缓存:释放 2.1GB
2. 清理日志文件:释放 1.5GB
3. 当前使用率:87%

【建议】
- 考虑清理旧的项目文件
- 检查是否有大文件可删除

五、实战案例 3:网站内容监控

场景说明

每小时检查竞争对手网站,发现新内容时通知。

完整配置

javascript
cron(
  action="add",
  job={
    name: "竞争对手网站监控",
    schedule: {
      kind: "cron",
      expr: "0 * * * *",  // 每小时
      tz: "Asia/Shanghai"
    },
    payload: {
      kind: "agentTurn",
      message: `
监控竞争对手网站更新:

1. 抓取目标页面
   - https://competitor.com/blog
   - https://competitor.com/products

2. 提取最新内容
   - 文章标题
   - 发布时间
   - 摘要内容

3. 与上次检查结果对比
   - 读取 ~/.openclaw/workspace/competitor-last-check.json
   - 比较是否有新内容

4. 如有新内容:
   - 发送通知到飞书
   - 更新检查记录文件
   - 总结新内容要点

5. 如无新内容:
   - 静默退出(不发送通知)
      `,
      timeoutSeconds: 300
    },
    sessionTarget: "isolated"
  }
)

六、Webhook 集成

场景

定时任务完成后,将结果发送到外部系统(如钉钉、企业微信)。

配置示例

javascript
cron(
  action="add",
  job={
    name: "每日数据同步",
    schedule: {
      kind: "cron",
      expr: "0 2 * * *",  // 每天凌晨 2 点
      tz: "Asia/Shanghai"
    },
    payload: {
      kind: "agentTurn",
      message: "执行数据同步任务,完成后返回 JSON 结果",
      timeoutSeconds: 1800
    },
    sessionTarget: "isolated",
    delivery: {
      mode: "webhook",
      to: "https://api.example.com/webhook/sync-result",
      bestEffort: true  // 发送失败不重试
    }
  }
)

Webhook Payload 示例

json
{
  "jobId": "xxx-xxx-xxx",
  "jobName": "每日数据同步",
  "status": "finished",
  "startedAt": 1710813600000,
  "finishedAt": 1710814500000,
  "durationMs": 900000,
  "result": {
    "syncedRecords": 1250,
    "errors": 0,
    "summary": "同步完成,无错误"
  }
}

七、任务管理

查看任务列表

javascript
// 查看所有任务(包括禁用的)
cron(action="list", includeDisabled=true)

更新任务

javascript
// 修改任务执行时间
cron(
  action="update",
  jobId="task-id-xxx",
  patch={
    schedule: {
      kind: "cron",
      expr: "0 9 * * *"  // 改为每天 9:00
    }
  }
)

// 禁用任务
cron(
  action="update",
  jobId="task-id-xxx",
  patch={ enabled: false }
)

// 启用任务
cron(
  action="update",
  jobId="task-id-xxx",
  patch={ enabled: true }
)

删除任务

javascript
cron(action="remove", jobId="task-id-xxx")

手动触发

javascript
// 立即执行一次
cron(action="run", jobId="task-id-xxx", runMode="force")

查看执行历史

javascript
cron(action="runs", jobId="task-id-xxx")

八、最佳实践

1. 任务命名规范

javascript
// ✅ 好的命名
name: "每日早晨报告 - 邮件 + 日历 + 天气"
name: "系统健康检查 - 每 4 小时"
name: "网站备份 - 每天凌晨 3 点"

// ❌ 避免模糊命名
name: "定时任务 1"  // ❌
name: "检查"       // ❌

2. 错误处理

javascript
payload: {
  kind: "agentTurn",
  message: `
执行任务,注意:
1. 任何错误都要记录详细日志
2. 严重错误发送通知
3. 可恢复的错误尝试重试(最多 3 次)
4. 无论成功失败都要更新状态文件
  `,
  timeoutSeconds: 600
}

3. 避免任务堆积

javascript
// 设置合理的超时
timeoutSeconds: 300  // 5 分钟超时

// 检查是否有未完成的任务
const runs = cron(action="runs", jobId="xxx")
if (runs.some(r => r.status === "running")) {
  // 跳过本次执行或终止卡住的任务
}

4. 日志记录

javascript
// 在任务中记录详细日志
message: `
执行数据备份:
1. 记录开始时间和初始状态
2. 每一步都记录进度
3. 记录最终结果和耗时
4. 异常情况记录堆栈信息

日志保存到:/var/log/backup-YYYY-MM-DD.log
`

九、常见问题

Q: 时区如何设置?

A: 使用 tz 字段指定时区,如 "Asia/Shanghai"。不指定则使用 UTC。

Q: 任务执行失败怎么办?

A:

  1. 查看执行历史:cron(action="runs", jobId="xxx")
  2. 检查错误日志
  3. 调整超时时间或重试逻辑

Q: 如何调试定时任务?

A: 使用 cron(action="run", jobId="xxx", runMode="force") 手动触发测试。

Q: 任务可以互相触发吗?

A: 可以,在任务中调用 cron(action="run", jobId="yyy") 触发其他任务。

Q: sessionTarget 选 main 还是 isolated?

A:

  • isolated:隔离会话,适合独立任务(推荐)
  • main:主会话,会影响当前对话(慎用)

十、总结

定时任务是实现 AI 助理主动性的关键:

场景推荐配置
每日报告cron, 每天固定时间
定期检查cron, 每 N 小时
定时提醒at, 一次性执行
间隔任务every, 相对间隔

合理使用定时任务,让你的 AI 助理从"被动响应"变为"主动服务"!


相关资源:

Released under the MIT License.